<?php

class osecurity extends Object{
    
    public function __construct() {
        $this->LoadModel('usuario/login', 'uobj');
        $this->cod_usuario = $this->uobj->getCodUsuario();
    }
    
    /*
     * Retorn true se um usuário é administrador ou Webmaster false caso contrário
     */
    public function UserIsAdmin(){
        return ($this->uobj->UserIsAdmin());
    }
    
    /*
     * Retorn true se um usuário é superior hierárquico de um grupo false caso contrário
     */
    public function SuperiorHierarquico($cod_grupo){
        if($cod_grupo == "") return 0;
        static $superior = array();
        if(in_array($cod_grupo, $superior)) return @$superior[$cod_grupo];
        
        //usuário que não pertencem a nenhum grupo não tem permissão de superior hierárquico
        $this->LoadModel('ocorrencia/pertence', 'pobj');
        $grupos = $this->pobj->selecionar(array('cod_grupo'), "cod_usuario = '$this->cod_usuario'");
        if(empty ($grupos)) return false;
        
        //retorna uma lista de grupos que o usuário tem permissão de acesso
        $this->LoadModel('ocorrencia/grupo', 'gobj');
        $superiores = $this->gobj->getSuperiores($cod_grupo);
        
        //verifica se o usuário é superior hierárquico de um dos grupos
        foreach($grupos as $gr){
            if(in_array($gr['cod_grupo'], $superiores)){
                $superior[$cod_grupo] = 1;
                return 1;
            }
        }
        //$sub = $this->gobj->getSubordinados($cod_grupo);
        //$superior[$cod_grupo] = in_array($cod_grupo, $sub);
        //return $superior[$cod_grupo];
        $superior[$cod_grupo] = 0;
        return 0;
    }
    
    /*
     * Retorn true se um usuário pertence à um grupo de trabalho
     *        false caso contrário
     */
    public function PertenceAoGrupo($cod_grupo){
        static $list = array();
        $this->LoadModel('ocorrencia/grupo', 'gobj');
        if(empty ($list)) $list = $this->gobj->getPertenceList();
        if(empty ($list)) return false;
        foreach($list as $l) if($l['cod_grupo'] == $cod_grupo) return true;
        return false;
    }
    
    /*
     * Verifica se um usuário tem permissão para acessar os itens,
     * Quais itens a serem verificados são definidos nas classes filhas
     * atravé de um modelo que contém: 
     * código do que deve ser verificado => função a ser aplicada
     */
    public function get_permissions($cod){
        if(!isset($this->permissions)) return "";
        
        $out = "";
        foreach($this->permissions as $function => $perm){
            if(!$this->$function($cod)) continue;
            $out .= $perm;
        }
        return $out;
    }
    
    /*
     * 
     * Retorn true se um usuário é o responsável por uma Discussão
     *        false caso contrário
     */
    public function ResponsavelPorOcorrencia($cod_ocorrencia = ""){
        static $var = array();
        if($cod_ocorrencia == "" && !isset($_SESSION['ocorrencia/ocorrencias'])) return false;
        elseif(isset($_SESSION['ocorrencia/ocorrencias'])) $cod_ocorrencia = $_SESSION['ocorrencia/ocorrencias'];

        $cod_usuario = $this->uobj->getCodUsuario();
        $this->LoadModel('ocorrencia/envolvido', 'eobj');
        
        if(!isset($var[$cod_usuario][$cod_ocorrencia]))
            $var[$cod_usuario][$cod_ocorrencia] = $this->eobj->getItem(array($cod_usuario,$cod_ocorrencia));

        if(!isset($var[$cod_usuario][$cod_ocorrencia]['tipo_envolvimento'])) return false;
        
        $temp = strtolower($var[$cod_usuario][$cod_ocorrencia]['tipo_envolvimento']);
        $temp = GetPlainName($temp);
        if($temp == 'responsavel') return true;
        return false;
        //return ($temp == 'envolvido');
    }
    
    /*
     * gera as permissoes
     */
    protected $userpermission  = array();
    protected $check_functions = array();
    protected $permissions     = array();
    protected function GenPermission($cod){
        if(!array_key_exists($cod, $this->userpermission)){
            $this->userpermission[$cod] = "";
            foreach($this->check_functions as $func){
                if($this->$func($cod)){
                    $this->userpermission[$cod] .= $this->permissions[$func];
                }
            }
        }
        return $this->userpermission[$cod];
    }
    
    public function CheckCreatePermission($cod_grupo = ""){
        return $this->CheckPermission($cod_grupo, "C");
    }
    
    public function CheckEditPermission($cod_grupo = ""){
        return $this->CheckPermission($cod_grupo, "U");
    }
    
    public function CheckReadPermission($cod_grupo = ""){
        return $this->CheckPermission($cod_grupo, "R");
    }

    public function CheckDeletePermission($cod_grupo = ""){
        return $this->CheckPermission($cod_grupo, "D");
    }

    protected function CheckPermission($cod_grupo, $letra){
        $permission = $this->GenPermission($cod_grupo);
        if($permission == "") return false;
        if(strstr($permission, $letra) === false) return false;
        return true;
    }
    
    protected function addMenu($event, $arr){
        if(!isset($this->menu_sec_obj) || !is_object($this->menu_sec_obj))
            $this->LoadJsPlugin('menu/multiple', 'menu_sec_obj');
        $this->menu_sec_obj->imprime();
        $var = $this->menu_sec_obj->draw($arr);
        EventTube::addEvent($event, $var);
    }
    
}

?>